Міністерство освіти і науки України
Національний університет «Львівська політехніка»
Інститут комп’ютерних наук та інформаційних технологій
Кафедра автоматизованих систем управління
Лабораторна робота №3
З курсу:
«Комп’ютерна графіка»
Тема:Параллельні та косокутні проекції.
Мета: Ознайомлення з елементарним математичним апаратом плоских геометричних проекцій
.
ТЕОРЕТИЧНІ ОСНОВИ
Паралельні проекції
Будемо вважати, що при центральному проектуванні картинна площина перпендикулярна oci z i збігається з площиною z = d, а при паралельному збігається з площиною z = 0. Проекції розглядаються в системі координат спостерігача, що є лівосторонньою. Система координат, в якій вicь х спрямована вправо, вісь у - вгору, а вісь z - усередину екрана, природньо погоджується з екраном дисплея.
На рис.3.1 наведені три зображення лівосторонньої системи координат, у яких точка Р проектується на проекційну площину, розташовану на відстані d від початку координат. Для обчислення координат Хp i Yp проекції точки (х, у, z) напишемо сшвввдношения, отримані з подібності трикутників.
Ці перетворення можна представити у вигляді матриці розміром 4х4.
Косокутні проекції
Тепер розглянемо довільну точку х, у, z i визначимо її косокутну проекцію (Хр,Ур) на площину ху. На рис. показані два зображення точки i проектор. Рівняння для х- і у -координат проектора як функцій z мають вигляд у=тz+b. Вирішуючи два рівняння відносно Хр i Yp, виззначених на рис одержуемо:
Текст программного коду:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Grids, StdCtrls, ExtCtrls,Math;
type
TForm1 = class(TForm)
Button1: TButton;
RadioGroup1: TRadioGroup;
Image1: TImage;
Label1: TLabel;
Label2: TLabel;
Button2: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Label3: TLabel;
Edit5: TEdit;
Edit6: TEdit;
Label4: TLabel;
Edit7: TEdit;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
Label10: TLabel;
Label11: TLabel;
Label12: TLabel;
Label13: TLabel;
Label14: TLabel;
procedure Button1Click(Sender: TObject);
procedure koord();
procedure draw_P(x_p,y_p,z_p:double);
procedure Button2Click(Sender: TObject);
procedure RadioGroup1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
x0,y0,z0,delta,delta_zx,delta_zy,x1,y1:integer;
delta_yz,delta_yx:integer;
implementation
procedure TForm1.koord();
var delta_p,x1,x2,x3,x4,y1,y2,y3,y4,i,z:integer;
begin
x0:=round(image1.Width/2);
y0:=round((image1.Height)/2);
with image1.Canvas do
begin
if (image1.Width-x0)>(image1.Height-y0) then
delta:=round((image1.Height-y0)/10)
else
delta:=round((image1.Width-x0)/10);
x1:=x0;
x2:=x0;
x3:=x0;
x4:=x0;
y1:=y0;
y2:=y0;
y3:=y0;
y4:=y0;
for i:=0 to 10 do begin
delta_p:=delta;
MoveTo(x0,y1);
LineTo(x0,y1-delta_p);
moveto(x0-2,y1-delta_p);
LineTo (x0+2,y1-delta_p);
y1:=y1-delta_p;
MoveTo(x3,y0);
LineTo(x3+delta_p,y0);
moveto(x3+delta_p,y0-2);
LineTo (x3+delta_p,y0+2);
x3:= x3+delta_p;
///////////////////////*****************
z:=delta_p;
MoveTo(x4,y2);
LineTo(x4-round(z*cos(0.5)),y2+round(z*sin(0.5)));
moveto(x4-round(z*cos(0.5)),y2+round(z*sin(0.5))-2);
LineTo (x4-round(z*cos(0.5)),y2+round(z*sin(0.5))+2);
x4:= x4-round(z*cos(0.5));
y2:=y2+round(z*sin(0.5));
z:=z+delta_p;
if i=9 then begin
TextOut(x0+3,y1-delta_p+16,'x');
TextOut(x3+delta_p,y0,'z');
TextOut(x4-round(z*cos(0.5)),y2+round(z*sin(0.5)),'y');
end;
end;
end;
end;
procedure TForm1.draw_P(x_p,y_p,z_p:double);
var x1,y1,z1,x2,y2,i:integer;
begin
with image1.Canvas do
begin
...